#include "Comm.hpp"
#include "Fifo.hpp"

int main()
{
    // 1. 获取key
    key_t key = GetShmKeyOrDie();
    cout << "key:" << ToHex(key) << endl;
    // 2. 创建共享内存
    int shmid = CreateShm(key, defaultsize);
    cout << "shmid: " << shmid << endl;
    // 3. 将共享内存和进程进行挂接(关联)
    char *addr = (char *)ShmAttach(shmid);
    cout << "Attach shm success, addr:" << ToHex((uint64_t)addr) << endl;
    // 0.先引入管道协调起来，使得共享内存是进程间通信速度最快的方式优点，但缺点是进程间不能协调
    Fifo fifo;
    Sync syn;
    syn.OpenReadOrDie();
    // 4. 可以进行通信了
    for (;;)
    {
        if (!syn.Wait())
            break;                                    // 一旦客户端不写了，进程退出关闭了写端，读端阻塞挂起就会读到n==0 return false 服务端也退出
        cout << "shm content: " << addr << std::endl; // 如果客户端每写完一次，就会通过管道发送一个0被服务端读端读取成功，return true
        // 服务端就开始将写入共享内存的一句读出来，这样每写完一次就通过命名管道唤醒读端，开始读取共享内存
    }

    // 5. 通信完毕，去关联，
    ShmDetach(addr);
    cout << "Detach shm success, addr:" << addr << endl;
    // 删除共享内存，释放命名管道，进程退出
    DeleteShm(shmid);
    return 0;
}
